--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
meshchatx/src/backend/plugin_signature.py a9cc4b996b8da8ff414e305825f372ca12dc138d (a9cc4b99) Text, 6.53 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Canonical plugin payloads and signature verification for ZIP/dir/WASM."""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787io
Tff7b72import T7ee787os
Tff7b72import T7ee787zipfile
Tff7b72from T7ee787collectionsT7ee787.T7ee787abc Tff7b72import Te6edf3Iterable
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_rsg Tff7b72import Te6edf3SignatureInfoTb4b4b4, Te6edf3verify_rsg_payload
Te6edf3PRIMARY_SIGNATURE_FILE Tff7b72= Ta5d6ff"Ta5d6ffmeshchatx.plugin.rsgTa5d6ff"
Te6edf3SIGNATURE_FILE_NAMES Tff7b72= Tb4b4b4(Te6edf3PRIMARY_SIGNATURE_FILETb4b4b4,Tb4b4b4)
Te6edf3FIXED_ZIP_DATE_TIME Tff7b72= Tb4b4b4(T79c0ff1980Tb4b4b4, T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ffis_signature_basenameTb4b4b4(Te6edf3nameTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Te6edf3base Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3nameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3base Tff7b72in Te6edf3SIGNATURE_FILE_NAMES
Tff7b72def Td2a8ffbuild_canonical_zipTb4b4b4(Te6edf3entriesTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657bytesTb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Te6edf3buf Tff7b72= Te6edf3ioTff7b72.Td2a8ffBytesIOTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3bufTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3compressionTff7b72=Te6edf3zipfileTff7b72.Td2a8ffZIP_DEFLATEDTb4b4b4) Tff7b72as Te6edf3archiveTb4b4b4:
Tff7b72for Te6edf3name Tff7b72in Tffa657sortedTb4b4b4(Te6edf3entriesTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3info Tff7b72= Te6edf3zipfileTff7b72.Td2a8ffZipInfoTb4b4b4(Te6edf3filenameTff7b72=Te6edf3nameTb4b4b4)
Te6edf3infoTff7b72.Td2a8ffdate_time Tff7b72= Te6edf3FIXED_ZIP_DATE_TIME
Te6edf3infoTff7b72.Td2a8ffcompress_type Tff7b72= Te6edf3zipfileTff7b72.Td2a8ffZIP_DEFLATED
Te6edf3archiveTff7b72.Td2a8ffwritestrTb4b4b4(Te6edf3infoTb4b4b4, Te6edf3entriesTb4b4b4[Te6edf3nameTb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3bufTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffcanonical_dir_payloadTb4b4b4(Te6edf3directoryTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Te6edf3entriesTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657bytesTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3rootTb4b4b4, Te6edf3_dirsTb4b4b4, Te6edf3files Tff7b72in Te6edf3osTff7b72.Td2a8ffwalkTb4b4b4(Te6edf3directoryTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3filename Tff7b72in Te6edf3filesTb4b4b4:
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3filenameTb4b4b4)
Te6edf3rel Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrelpathTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3directoryTb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3is_signature_basenameTb4b4b4(Te6edf3relTb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3entriesTb4b4b4[Te6edf3relTb4b4b4] Tff7b72= Te6edf3handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3build_canonical_zipTb4b4b4(Te6edf3entriesTb4b4b4)
Tff7b72def Td2a8ffcanonical_zip_payload_from_bytesTb4b4b4(Te6edf3payloadTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Te6edf3entriesTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657bytesTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3ioTff7b72.Td2a8ffBytesIOTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4) Tff7b72as Te6edf3archiveTb4b4b4:
Tff7b72for Te6edf3info Tff7b72in Te6edf3archiveTff7b72.Td2a8ffinfolistTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3infoTff7b72.Td2a8ffis_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3clean Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffnormpathTb4b4b4(Te6edf3infoTff7b72.Td2a8fffilenameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(
Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3clean Tff7b72in Tb4b4b4{Ta5d6ff"Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4}Tb4b4b4:
Tff7b72continue
Tff7b72if Te6edf3cleanTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff../Ta5d6ff"Tb4b4b4) Tff7b72or Te6edf3cleanTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffzip path traversal: Tffd700{Te6edf3infoTff7b72.Td2a8fffilenameTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3is_signature_basenameTb4b4b4(Te6edf3cleanTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3entriesTb4b4b4[Te6edf3cleanTb4b4b4] Tff7b72= Te6edf3archiveTff7b72.Td2a8ffreadTb4b4b4(Te6edf3infoTff7b72.Td2a8fffilenameTb4b4b4)
Tff7b72return Te6edf3build_canonical_zipTb4b4b4(Te6edf3entriesTb4b4b4)
Tff7b72def Td2a8fffind_signature_in_dirTb4b4b4(Te6edf3directoryTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657bytes Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72for Te6edf3name Tff7b72in Te6edf3SIGNATURE_FILE_NAMESTb4b4b4:
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3directoryTb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Tff7b72return Te6edf3handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffverify_dir_signatureTb4b4b4(Te6edf3directoryTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Te6edf3SignatureInfoTb4b4b4:
Te6edf3rsg_data Tff7b72= Te6edf3find_signature_in_dirTb4b4b4(Te6edf3directoryTb4b4b4)
Tff7b72if Te6edf3rsg_data Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3SignatureInfoTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3payload Tff7b72= Te6edf3canonical_dir_payloadTb4b4b4(Te6edf3directoryTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3SignatureInfoTb4b4b4(Te6edf3presentTff7b72=Tff7b72TrueTb4b4b4, Te6edf3errorTff7b72=Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3verify_rsg_payloadTb4b4b4(Te6edf3rsg_dataTb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72def Td2a8ffverify_zip_signatureTb4b4b4(Te6edf3payloadTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Te6edf3SignatureInfoTb4b4b4:
Te6edf3rsg_data Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3ioTff7b72.Td2a8ffBytesIOTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4) Tff7b72as Te6edf3archiveTb4b4b4:
Tff7b72for Te6edf3info Tff7b72in Te6edf3archiveTff7b72.Td2a8ffinfolistTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3clean Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffnormpathTb4b4b4(Te6edf3infoTff7b72.Td2a8fffilenameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(
Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3is_signature_basenameTb4b4b4(Te6edf3cleanTb4b4b4)Tb4b4b4:
Te6edf3rsg_data Tff7b72= Te6edf3archiveTff7b72.Td2a8ffreadTb4b4b4(Te6edf3infoTff7b72.Td2a8fffilenameTb4b4b4)
Tff7b72break
Tff7b72if Tff7b72not Te6edf3rsg_dataTb4b4b4:
Tff7b72return Te6edf3SignatureInfoTb4b4b4(Tb4b4b4)
Te6edf3canonical Tff7b72= Te6edf3canonical_zip_payload_from_bytesTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3SignatureInfoTb4b4b4(Te6edf3presentTff7b72=Tff7b72TrueTb4b4b4, Te6edf3errorTff7b72=Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3verify_rsg_payloadTb4b4b4(Te6edf3rsg_dataTb4b4b4, Te6edf3canonicalTb4b4b4)
Tff7b72def Td2a8ffverify_wasm_signatureTb4b4b4(Te6edf3dataTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Te6edf3SignatureInfoTb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_wasm_bundle Tff7b72import Tb4b4b4(
Te6edf3parse_wasm_bundleTb4b4b4,
Te6edf3wasm_payload_without_signatureTb4b4b4,
Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3bundle Tff7b72= Te6edf3parse_wasm_bundleTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3SignatureInfoTb4b4b4(Te6edf3errorTff7b72=Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3bundleTff7b72.Td2a8ffsignatureTb4b4b4:
Tff7b72return Te6edf3SignatureInfoTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3payload Tff7b72= Te6edf3wasm_payload_without_signatureTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3SignatureInfoTb4b4b4(Te6edf3presentTff7b72=Tff7b72TrueTb4b4b4, Te6edf3errorTff7b72=Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3verify_rsg_payloadTb4b4b4(Te6edf3bundleTff7b72.Td2a8ffsignatureTb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72def Td2a8ffverify_file_bytes_signatureTb4b4b4(
Te6edf3rsg_dataTb4b4b4: Tffa657bytes Tff7b72| Tff7b72NoneTb4b4b4,
Te6edf3payloadTb4b4b4: Tffa657bytesTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3SignatureInfoTb4b4b4:
Tff7b72if Tff7b72not Te6edf3rsg_dataTb4b4b4:
Tff7b72return Te6edf3SignatureInfoTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3verify_rsg_payloadTb4b4b4(Te6edf3rsg_dataTb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72def Td2a8ffverify_py_signatureTb4b4b4(Te6edf3py_pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Te6edf3SignatureInfoTb4b4b4:
Te6edf3rsg_path Tff7b72= Te6edf3py_path Tff7b72+ Ta5d6ff"Ta5d6ff.rsgTa5d6ff"
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3rsg_pathTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3SignatureInfoTb4b4b4(Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3py_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3message Tff7b72= Te6edf3handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3rsg_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3rsg_data Tff7b72= Te6edf3handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3verify_rsg_payloadTb4b4b4(Te6edf3rsg_dataTb4b4b4, Te6edf3messageTb4b4b4)
Tff7b72def Td2a8ffrequire_valid_signatureTb4b4b4(Te6edf3infoTb4b4b4: Te6edf3SignatureInfoTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3infoTff7b72.Td2a8ffpresentTb4b4b4:
Tff7b72return
Tff7b72if Te6edf3infoTff7b72.Td2a8ffvalidTb4b4b4:
Tff7b72return
Tff7b72if Te6edf3infoTff7b72.Td2a8fferrorTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffinvalid plugin signature: Tffd700{Te6edf3infoTff7b72.Td2a8fferrorTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid plugin signatureTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffwrite_dir_signatureTb4b4b4(Te6edf3directoryTb4b4b4: Tffa657strTb4b4b4, Te6edf3rsg_dataTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3rsg_dataTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffsignature is requiredTa5d6ff"Tb4b4b4)
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3directoryTb4b4b4, Te6edf3PRIMARY_SIGNATURE_FILETb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3rsg_dataTb4b4b4)
Tff7b72def Td2a8ffembed_signature_in_zip_bytesTb4b4b4(Te6edf3payloadTb4b4b4: Tffa657bytesTb4b4b4, Te6edf3rsg_dataTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Tff7b72if Tff7b72not Te6edf3rsg_dataTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffsignature is requiredTa5d6ff"Tb4b4b4)
Te6edf3entriesTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657bytesTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3ioTff7b72.Td2a8ffBytesIOTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4) Tff7b72as Te6edf3archiveTb4b4b4:
Tff7b72for Te6edf3info Tff7b72in Te6edf3archiveTff7b72.Td2a8ffinfolistTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3infoTff7b72.Td2a8ffis_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3clean Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffnormpathTb4b4b4(Te6edf3infoTff7b72.Td2a8fffilenameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(
Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3clean Tff7b72in Tb4b4b4{Ta5d6ff"Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4} Tff7b72or Te6edf3is_signature_basenameTb4b4b4(Te6edf3cleanTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3entriesTb4b4b4[Te6edf3cleanTb4b4b4] Tff7b72= Te6edf3archiveTff7b72.Td2a8ffreadTb4b4b4(Te6edf3infoTff7b72.Td2a8fffilenameTb4b4b4)
Te6edf3entriesTb4b4b4[Te6edf3PRIMARY_SIGNATURE_FILETb4b4b4] Tff7b72= Te6edf3rsg_data
Tff7b72return Te6edf3build_canonical_zipTb4b4b4(Te6edf3entriesTb4b4b4)
Tff7b72def Td2a8ffenrich_signature_with_trustTb4b4b4(Te6edf3infoTb4b4b4: Te6edf3SignatureInfoTb4b4b4, Te6edf3lookup_trustedTb4b4b4) Tff7b72-Tff7b72> Te6edf3SignatureInfoTb4b4b4:
Tff7b72if Tff7b72not Te6edf3infoTff7b72.Td2a8ffvalid Tff7b72or Tff7b72not Te6edf3infoTff7b72.Td2a8ffsignerTb4b4b4:
Tff7b72return Te6edf3info
Te6edf3nameTb4b4b4, Te6edf3trusted Tff7b72= Te6edf3lookup_trustedTb4b4b4(Te6edf3infoTff7b72.Td2a8ffsignerTb4b4b4)
Tff7b72return Te6edf3SignatureInfoTb4b4b4(
Te6edf3presentTff7b72=Te6edf3infoTff7b72.Td2a8ffpresentTb4b4b4,
Te6edf3validTff7b72=Te6edf3infoTff7b72.Td2a8ffvalidTb4b4b4,
Te6edf3signerTff7b72=Te6edf3infoTff7b72.Td2a8ffsignerTb4b4b4,
Te6edf3signer_nameTff7b72=Te6edf3name Tff7b72or Te6edf3infoTff7b72.Td2a8ffsigner_nameTb4b4b4,
Te6edf3trustedTff7b72=Te6edf3trustedTb4b4b4,
Te6edf3errorTff7b72=Te6edf3infoTff7b72.Td2a8fferrorTb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ffcollect_signature_file_namesTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3IterableTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4:
Tff7b72return Te6edf3SIGNATURE_FILE_NAMES
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────